『A Philosophy of Software Design』
APoSD
https://gyazo.com/05c6cdbf4119afdccbc9f08388e542be
2018/4/6
John Ousterhout 著
Yaknyam Press
2021/7に第2版が出た
差分はChapter21が増えたのと、いくつかの章への追記
著者のサイトから差分のPDFが読める
fukabori.fm 100から3回に渡って解説がされている
著者が翻訳を出さないことを明言してるらしい
英語はだいぶ平易なので読める
102の最後の方で、著者は出身が低レイヤ寄りなのでその辺も考慮しながら読むと良いみたいなことを言ってた
/mrsekut-book-APoSD
第2版のものも追加した
200ページぐらいしか無いのねmrsekut.icon
Preface
/mrsekut-book-APoSD/008 (Preface)
最も基本的な問題は問題の分解だが、大学で教えられないがち
なので著者がそういうクラスを作った(CS190)
この本はクラスから生まれた設計原則に基づいている
1 Introduction
/mrsekut-book-APoSD/Chapter1 (はじめに すべては複雑さについて)
複雑さと戦うための2つのアプローチ
コードをシンプルで明白にして複雑さを排除する
カプセル化する
2 The Nature of Complexity
/mrsekut-book-APoSD/Chapter2 複雑さの本質
Complexityの定義
3 Working Code Isn't Enough
/mrsekut-book-APoSD/Chapter3 動くコードだけでは不十分
Tactical ProgrammingよりStrategic programming
著者と思想が似ているため、あまり衝撃を受けるほどの感動がないmrsekut.icon
そうだね、わかるわかる、という気持ちになる
4 Modules Should Be Deep
/mrsekut-book-APoSD/Chapter4 (モジュールは深くあるべき)
Deep Modules
5 Information Hiding (and Leakage)
/mrsekut-book-APoSD/Chapter 5 情報の隠蔽(と漏洩)
詳細の漏洩
6 General-Purpose Modules are Deeper
/mrsekut-book-APoSD/Chapter6 汎用モジュールは深い
特殊ケースではなく汎用ケースに対応するように書く
具体的なケースは、汎用的なものと分離して、上方や下方に押し上げる
上方の例は、一部のレイヤでしかIOを使わない感じ
下方の例は、各OSへの特殊対応を抽象化してる感じ
特殊ケースを排除する
7 Different Layer, Different Abstraction
/mrsekut-book-APoSD/Chapter7 異なる層、異なる抽象化
異なる層は異なる抽象化をする
抽象度を揃えて書くと関連が大きい
/mrsekut-book-APoSD/Chapter7 異なる層、異なる抽象化#6620d405198270000056214e
インターフェースと実装の抽象は異なるべき
/mrsekut-book-APoSD/Chapter7 異なる層、異なる抽象化#6620d3fd198270000056209b
もし両者が類似の抽象化を持っていれば、それは恐らくあまり深く(Deep Modules)ない
Pass-through methods
Pass-through variables
8 Pull Complexity Downwards
/mrsekut-book-APoSD/Chapter8 複雑性を下層に引き下げる
複雑性をモジュール内に閉じ込めて、
利用者が使いやすいインターフェースを公開しよう
逆に、無駄に細かい挙動の設定をインターフェースにわざわざ露出させるな、
といった至極当たり前のことが解説されている
9 Better Together Or Better Apart?
/mrsekut-book-APoSD/第9章 一緒にする方が良いのか、別々にする方が良いのか?
細かく分けるのもいくらかの問題があるよという主張
あまり見かけない割と珍しい主張
と、思ったが、moduleぐらいの抽象度で考えれば納得感はあるmrsekut.icon
概念的に同じ、一緒に使う、にも関わらず別のmoduleにあると、ん?となる
そんなにアクロバットな主張をしてるわけでもない
細かく分けるより一緒にしたほうがシンプルになる場合はそっちを選ぶのがええよ、と言ってるだけ
10 Define Errors Out Of Existence
/mrsekut-book-APoSD/Chapter10 エラーを存在しないものとして定義する
例外を減らす工夫いくつか
11 Design it Twice
/mrsekut-book-APoSD/Chapter11 二度設計する
全く異なるアプローチの代替案を考えることに関するエッセイ
割と好きmrsekut.icon
12 Why Write Comments? The Four Excuses
/mrsekut-book-APoSD/Chapter 12 コメントを書く理由?四つの言い訳
コメントを書こうねという話
コメントを書かない以下のような意見に対する批判
「良いコードは自己文書化する。」
「コメントを書く時間がない。」
「コメントは古くなり、誤解を招くようになる。」
「私が見たコメントはすべて価値がない。何のために書くのか?」
13 Comments Should Describe Things that Aren't Obvious from the Code
/mrsekut-book-APoSD/Chapter13 コメントはコードから明らかでない事項を説明すべきです
良いコメントの書き方について
分量多すぎてちょっと読み飛ばしちゃったが、主張は割とわかるmrsekut.icon
要は、コメントにも抽象度が存在して、
利用者向けの抽象度の高いコメント(コードの抽象表現としてのコメント)と、
詳細を知るための実装コメント
のように分類して考えるというもの
14 Choosing Names
/mrsekut-book-APoSD/Chapter14 名前の選び方
命名について
正確さと一貫性
15 Write The Comments First
/mrsekut-book-APoSD/Chapter15 コメントを先に書く
タイトルの通り
命名や型を先に考えるのとほぼ同じ
16 Modifying Existing Code
/mrsekut-book-APoSD/第16章 既存のコードの修正
17 Consistency
/mrsekut-book-APoSD/第17章 一貫性
/mrsekut-book-APoSD/17.2 一貫性を保証する
自分のアプローチよりも既存のコードのアプローチを採用するか否かとかの話
より良いアイデアを持っているというだけでは、一貫性がないものを導入する理由にならない
18 Code Should be Obvious
/mrsekut-book-APoSD/第18章 コードは明白であるべき
読者がコードを読む際に、新しい情報を学ぶ必要がないようにする
/mrsekut-book-APoSD/18.3 結論
割と強めの主張に見えたが、自分が慣れているだけで、インターフェースの観点から見れば確かにそうかもという気持ちになったmrsekut.icon
event駆動はトレースしづらい
tupleは値に対する情報量がない
19 Software Trends
/mrsekut-book-APoSD/第19章 ソフトウェアのトレンド
OOPの2つの継承
アジャイル
ユニットテスト
TDD
デザパタ
getter/setter
開発の単位は機能ではなく抽象化であるべき
20 Designing for Performance
/mrsekut-book-APoSD/第20章 パフォーマンスのための設計
パフォーマンス
21 Decide What Matters
/mrsekut-book-APoSD/第21章 重要なことを決める
重要なものと重要でないものを分ける
第2版で増えた章
いいねmrsekut.icon
22 Conclusion
/mrsekut-book-APoSD/第21章 結論